/**
 ******************************************************************************
 * @file           : bsp_adc_config.h
 * @brief          : ADC Configuration File (STM32F4xx)
 ******************************************************************************
 * @attention
 *
 * ADC配置文件
 * STM32F4xx使用DMA Stream进行ADC数据传输
 *
 ******************************************************************************
 */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __BSP_ADC_CONFIG_H
#define __BSP_ADC_CONFIG_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "stm32f4xx.h"

/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/

/* ============================================================================ */
/*                       日志系统配置（改这里的数字）                             */
/* ============================================================================ */
/* 日志后端选择：1=EasyLogger, 2=printf, 0=关闭 */
#define ADC_USE_LOG     1

/* 根据配置自动定义日志宏 */
#if (ADC_USE_LOG == 1)
    /* 使用EasyLogger */
    #ifndef LOG_TAG
        #define LOG_TAG    "ADC"
    #endif
    #include "elog.h"
    
#elif (ADC_USE_LOG == 2)
    /* 使用printf */
    #include <stdio.h>
    #define log_i(fmt, ...)     printf(fmt "\r\n", ##__VA_ARGS__)
    #define log_w(fmt, ...)     printf("[WARN] " fmt "\r\n", ##__VA_ARGS__)
    #define log_e(fmt, ...)     printf("[ERROR] " fmt "\r\n", ##__VA_ARGS__)
    #define log_d(fmt, ...)     printf("[DEBUG] " fmt "\r\n", ##__VA_ARGS__)
    
#else
    /* 关闭日志 */
    #define log_i(fmt, ...)
    #define log_w(fmt, ...)
    #define log_e(fmt, ...)
    #define log_d(fmt, ...)
#endif

/* ============================================================================ */
/*                      ADC选择配置（改这里即可切换ADC）                         */
/* ============================================================================ */
/**
 * @brief ADC选择（1~3）
 * 
 * STM32F4 ADC资源：
 *   ADC1: 12位精度，DMA2 Stream0/4, Channel 0
 *   ADC2: 12位精度，DMA2 Stream2/3, Channel 1
 *   ADC3: 12位精度，DMA2 Stream0/1, Channel 2
 * 
 * 推荐使用ADC1（配置最简单）
 */
#define ADC_SELECT_NUM              1       /*!< 选择使用的ADC号 */

/**
 * @brief ADC分辨率配置
 * 
 * 可选值：
 *   12 = 12位分辨率（0~4095）
 *   10 = 10位分辨率（0~1023）
 *   8  = 8位分辨率（0~255）
 *   6  = 6位分辨率（0~63）
 */
#define ADC_RESOLUTION              12      /*!< ADC分辨率 */

/**
 * @brief ADC通道数量
 * 
 * 最多支持16个通道（通道0~15）
 */
#define ADC_CHANNEL_NUM             2       /*!< 采集的通道数量 */

/**
 * @brief ADC采样时间配置
 * 
 * 可选值（以ADC时钟周期为单位）：
 *   3, 15, 28, 56, 84, 112, 144, 480
 * 
 * 推荐：84（适中的采样时间）
 */
#define ADC_SAMPLE_TIME             84      /*!< 采样时间 */

/**
 * @brief 使能DMA传输
 * 
 * 1 = 使用DMA
 * 0 = 轮询模式
 */
#define ADC_USE_DMA                 1       /*!< 使能DMA */

/* ============================================================================ */
/*                      滤波和传感器配置                                          */
/* ============================================================================ */
/**
 * @brief 使能数据滤波
 * 
 * 1 = 启用一阶低通滤波
 * 0 = 禁用滤波
 */
#define ADC_FILTER_ENABLE           1       /*!< 数据滤波使能 */

/**
 * @brief 滤波系数（0.0~1.0）
 * 
 * 值越小滤波效果越强，响应越慢
 * 推荐值：0.2（平衡响应速度和平滑度）
 */
#define ADC_FILTER_ALPHA            0.2f    /*!< 一阶低通滤波系数 */

/**
 * @brief 参考电压（mV）
 * 
 * 通常为3300mV（3.3V）
 */
#define ADC_VREF_MV                 3300    /*!< ADC参考电压(mV) */

/**
 * @brief 温度传感器参数
 * 
 * STM32F4内部温度传感器特性
 */
#define ADC_TEMP_V25_MV             1430    /*!< 25℃时温度传感器电压(mV) */
#define ADC_TEMP_AVG_SLOPE          4.3f    /*!< 温度传感器斜率(mV/℃) */

/* ============================================================================ */
/*                    自动配置区域（请勿手动修改）                                */
/* ============================================================================ */

/* ADC分辨率宏定义 */
#if (ADC_RESOLUTION == 12)
    #define ADC_RESOLUTION_CONFIG       ADC_RESOLUTION_12B
    #define ADC_MAX_VALUE               4095
#elif (ADC_RESOLUTION == 10)
    #define ADC_RESOLUTION_CONFIG       ADC_RESOLUTION_10B
    #define ADC_MAX_VALUE               1023
#elif (ADC_RESOLUTION == 8)
    #define ADC_RESOLUTION_CONFIG       ADC_RESOLUTION_8B
    #define ADC_MAX_VALUE               255
#elif (ADC_RESOLUTION == 6)
    #define ADC_RESOLUTION_CONFIG       ADC_RESOLUTION_6B
    #define ADC_MAX_VALUE               63
#else
    #error "Invalid ADC_RESOLUTION, please select 6/8/10/12"
#endif

/* ADC采样时间宏定义 */
#if (ADC_SAMPLE_TIME == 3)
    #define ADC_SAMPLETIME_CONFIG       ADC_SAMPLETIME_3CYCLES
#elif (ADC_SAMPLE_TIME == 15)
    #define ADC_SAMPLETIME_CONFIG       ADC_SAMPLETIME_15CYCLES
#elif (ADC_SAMPLE_TIME == 28)
    #define ADC_SAMPLETIME_CONFIG       ADC_SAMPLETIME_28CYCLES
#elif (ADC_SAMPLE_TIME == 56)
    #define ADC_SAMPLETIME_CONFIG       ADC_SAMPLETIME_56CYCLES
#elif (ADC_SAMPLE_TIME == 84)
    #define ADC_SAMPLETIME_CONFIG       ADC_SAMPLETIME_84CYCLES
#elif (ADC_SAMPLE_TIME == 112)
    #define ADC_SAMPLETIME_CONFIG       ADC_SAMPLETIME_112CYCLES
#elif (ADC_SAMPLE_TIME == 144)
    #define ADC_SAMPLETIME_CONFIG       ADC_SAMPLETIME_144CYCLES
#elif (ADC_SAMPLE_TIME == 480)
    #define ADC_SAMPLETIME_CONFIG       ADC_SAMPLETIME_480CYCLES
#else
    #error "Invalid ADC_SAMPLE_TIME, please select 3/15/28/56/84/112/144/480"
#endif

/* --------------------------------------------------------------------------- */
/* ADC1 配置 (DMA2 Stream0, Channel 0)                                        */
/* --------------------------------------------------------------------------- */
#if (ADC_SELECT_NUM == 1)
    #define ADC_ADCx                        ADC1
    #define ADC_ADCx_CLK_ENABLE()           __HAL_RCC_ADC1_CLK_ENABLE()
    
    #if (ADC_USE_DMA == 1)
        #define ADC_DMAx                        DMA2
        #define ADC_DMAx_STREAMx                DMA2_Stream0
        #define ADC_DMAx_CHANNELx               DMA_CHANNEL_0
        #define ADC_DMAx_STREAMx_IRQn           DMA2_Stream0_IRQn
        #define ADC_DMAx_CLK_ENABLE()           __HAL_RCC_DMA2_CLK_ENABLE()
    #endif

/* --------------------------------------------------------------------------- */
/* ADC2 配置 (DMA2 Stream2, Channel 1)                                        */
/* --------------------------------------------------------------------------- */
#elif (ADC_SELECT_NUM == 2)
    #define ADC_ADCx                        ADC2
    #define ADC_ADCx_CLK_ENABLE()           __HAL_RCC_ADC2_CLK_ENABLE()
    
    #if (ADC_USE_DMA == 1)
        #define ADC_DMAx                        DMA2
        #define ADC_DMAx_STREAMx                DMA2_Stream2
        #define ADC_DMAx_CHANNELx               DMA_CHANNEL_1
        #define ADC_DMAx_STREAMx_IRQn           DMA2_Stream2_IRQn
        #define ADC_DMAx_CLK_ENABLE()           __HAL_RCC_DMA2_CLK_ENABLE()
    #endif

/* --------------------------------------------------------------------------- */
/* ADC3 配置 (DMA2 Stream0, Channel 2)                                        */
/* --------------------------------------------------------------------------- */
#elif (ADC_SELECT_NUM == 3)
    #define ADC_ADCx                        ADC3
    #define ADC_ADCx_CLK_ENABLE()           __HAL_RCC_ADC3_CLK_ENABLE()
    
    #if (ADC_USE_DMA == 1)
        #define ADC_DMAx                        DMA2
        #define ADC_DMAx_STREAMx                DMA2_Stream0
        #define ADC_DMAx_CHANNELx               DMA_CHANNEL_2
        #define ADC_DMAx_STREAMx_IRQn           DMA2_Stream0_IRQn
        #define ADC_DMAx_CLK_ENABLE()           __HAL_RCC_DMA2_CLK_ENABLE()
    #endif

#else
    #error "Invalid ADC_SELECT_NUM, please select 1~3"
#endif

/* Exported macro ------------------------------------------------------------*/
/* Exported variables --------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/

#ifdef __cplusplus
}
#endif

#endif /* __BSP_ADC_CONFIG_H */
